/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gcs.util;

import gcs.modelo.Categoria;
import gcs.modelo.Combate;
import gcs.modelo.ParticipanteCategoria;
import gcs.modelo.Ronda;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 *
 * @author Rafe
 */
public class GestionRondas {
    public static Ronda generarPrimeraRonda(List<ParticipanteCategoria> pListaParticipantes, Categoria categoria){
        
        Random rnd = new Random();
        
        Ronda ronda = new Ronda(categoria);
        
        ronda.numeroDeRonda = 1;
        
        ronda.combates = new ArrayList<Combate>();
        
        List<ParticipanteCategoria> listaParticipantes = new ArrayList<ParticipanteCategoria>();
        
        listaParticipantes.addAll(pListaParticipantes);
        
        int i;
        
        while(listaParticipantes.size()>1){
            i = rnd.nextInt(listaParticipantes.size());
            Combate c = new Combate(ronda);
            c.participante1 = listaParticipantes.get(i);
            c.participante1.combateActual = c;
            listaParticipantes.remove(i);
            i = rnd.nextInt(listaParticipantes.size());
            c.participante2 = listaParticipantes.get(i);
            c.participante2.combateActual = c;
            listaParticipantes.remove(i);
            ronda.combates.add(c);
        }
        
        if (listaParticipantes.size()==1){
            Combate c = new Combate(ronda);
            c.participante1 = listaParticipantes.get(0);
            c.participante1.combateActual = c;
            c.participante2 = null;
            ronda.combates.add(c);
        }
        
        return ronda;
        
    }
    
    public static Ronda generarRonda(List<ParticipanteCategoria> pListaParticipantes, int numeroDeRonda, Categoria categoria){
        
        List<ParticipanteCategoria> listaParticipantes = new ArrayList<ParticipanteCategoria>();
        
        listaParticipantes.addAll(pListaParticipantes);
        
        Ronda ronda = new Ronda(categoria);
        
        ronda.numeroDeRonda = numeroDeRonda;
        
        ronda.combates = new ArrayList<Combate>();
        
        boolean esSolucion = backtracking(listaParticipantes, ronda);
        
        if(!esSolucion){
            ronda = null;
        }
        
        return ronda;
        
    }
        
    private static boolean backtracking(List<ParticipanteCategoria> listaParticipantes, Ronda ronda){
           
        boolean esSolucion = false;

        switch (listaParticipantes.size()) {
            case 0:
                esSolucion = true;
                break;
            case 1:
                esSolucion = true;
                Combate c1 = new Combate(ronda);
                c1.participante1 = listaParticipantes.get(0);
                c1.participante2 = null;
                ronda.combates.add(c1);
                c1.participante1.combateActual=c1;
                break;
            default:
                Combate c = new Combate(ronda);

                c.participante1 = listaParticipantes.get(0);

                listaParticipantes.remove(0);

                int i = 0;

                while (!esSolucion && i < listaParticipantes.size()) {

                    boolean esValido = false;
                    
                    while(!esValido && i < listaParticipantes.size()){
                        esValido = !c.participante1.haCombatidoCon(listaParticipantes.get(i));
                        if(!esValido){
                            i++;
                        }
                    }
                    
                    if(esValido){

                        c.participante2 = listaParticipantes.get(i);
                        listaParticipantes.remove(i);

                        esSolucion = backtracking(listaParticipantes, ronda);

                        if (esSolucion) {
                            ronda.combates.add(c);
                            c.participante1.combateActual=c;
                            c.participante2.combateActual=c;
                        } else {
                            listaParticipantes.add(i, c.participante2);
                            c.participante2 = null;
                            i++;
                        }
                    
                    }
                }
        }
        
        return esSolucion;
    
    }
    
}
